#include "wstring_string.h"

int wstring_string() {
    std::wstring str = L"我是中国人yzb";       // unicode 字符串

    // 定义一个转换器
	std::wstring_convert<std::codecvt<wchar_t, char, std::mbstate_t>> 
		converter(new std::codecvt<wchar_t, char, std::mbstate_t>("CHS"));

	std::string narrowStr = converter.to_bytes(str);

	std::wstring wstr = converter.from_bytes(narrowStr);
	std::cout << narrowStr << std::endl;

	std::wcout.imbue(std::locale("chs"));       // 初始化cout为中文输出
	std::wcout << wstr << std::endl;

    // std::wcout << L"你好啊！" << std::endl;   // 你好啊！
    std::cout << L"你好啊！" << std::endl;       // 0x7f87c6c5fa50
    std::cout << "你好啊！" << std::endl;        // 你好啊！
     

    //! L""与R""的区别
    /**
     * @brief  R"" 和 L"" 是 C++ 中用于表示字符串的两种不同的前缀，它们用于指定字符串字面量的类型和编码方式。
     * 
     * 
     *!  R""：原始字符串字面量
     *      >> 用途：R"" 用于创建原始字符串字面量（Raw String Literals），它允许你编写包含多种特殊字符的字符串，而不需要使用转义序列。
     *      >> 特点：原始字符串字面量保留了字符串中的所有字符，包括换行符、制表符、反斜杠等，而不需要像普通字符串那样对它们进行转义。
     *!  R称为原始字面量, 其完整格式为: R"xxx(raw string)xxx" 
     *      >> 原始字面量的内容需要用括号括起来;
     *      >> 括号外面可以加别的内容，括号前后的内容必须一致,  而且和部分内容会被忽略
     * 
     *  std::string rawStr = R"(Line1
     *  Line2
     *  Line3)";
     *  * 上面的字符串包含换行符和空格，无需对它们进行转义
     *
     *  
     *! L""：宽字符串字面量
     *      >> 用途：L"" 用于创建宽字符串字面量，它表明随后的字符串使用 wchar_t 类型的宽字符。
     *      >> 特点：宽字符串通常用于支持宽字符集（如 Unicode），在不同的平台上 wchar_t 可能是 16 位或 32 位。
     * 
     *  std::wstring wideStr = L"Hello, world!";
     *  * 这是一个宽字符串，每个字符使用 wchar_t 类型表示
     */
    
    return 0;
}